
Registration
------------

creatura.register_mob(name, mob definition)

Mob Definition uses almost all entity definition params

{
	max_health = 10 -- Maximum Health
	damage = 0 -- Damage dealt by mob
	speed = 4 -- Maximum Speed
	tracking_range = 16 -- Maximum range for finding entities/blocks
	despawn_after = 1500 -- Despawn after being active for this amount of time

	max_fall = 8 -- How far a mob can fall before taking damage (set to 0 to disable fall damage)
	turn_rate = 7 -- Turn Rate in rad/s
	bouyancy_multiplier = 1 -- Multiplier for bouyancy effects (set to 0 to disable bouyancy)
	hydrodynamics_multiplier = 1 -- Multiplier for hydroynamic effects (set to 0 to disable hydrodynamics)

	hitbox = { -- Hitbox params (Uses custom registration to force get_pos() to always return bottom of box)
		width = 0.5, (total width = width * 2. A width of 0.5 results in a box with a total width of 1)
		height = 1 (total height of box)
	}

	animations = {
		anim = {range = {x = 1, y = 10}, speed = 30, frame_blend = 0.3, loop = true}
	}

	drops = {
		{name = (itemstring), min = 1, max = 3, chance = 1},
	}
	follow = {
		"farming:seed_wheat",
		"farming:seed_cotton"
	}

	utility_stack = {
		-- Every second, all utilities in the stack are evaluated
		-- Whichever utilitiy's get_score function returns the highest number will be executed
		-- If multiple utilities have the same score, the one with the highest index is executed
		[1] = {
			`utility` -- name of utility to evaluate
			`get_score` -- function (only accepts `self` as an arg) that returns a number
		}
	}

	activate_func = function(self, staticdata, dtime_s) -- called upon activation
	step_func = function(self, dtime, moveresult) -- called every server step
	death_func = function(self) -- called when mobs health drops to/below 0
}

Lua Entity Methods
------------------

`move(pos, method, speed, animation)`
- `pos`: position to move to
- `method`: method used to move to `pos`
- `speed`: multiplier for `speed`
- `animation`: animation to play while moving

`halt()`
- stops movement

`turn_to(yaw[, turn_rate])`
- `yaw`: yaw (in radians) to turn to
- `turn_rate`: turn rate in rad/s (default: 10) -- likely to be deprecated

`set_gravity(gravity)`
- `gravity`: vertical acceleration rate

`set_forward_velocity(speed)`
- `speed`: rate in m/s to travel forward at

`set_vertical_velocity(speed)`
- `speed`: rate in m/s to travel vertically at

`apply_knockback(dir, power)`
- `dir`: direction vector
- `power`: multiplier for dir

`punch_target(target)`
- applies 'damage' to 'target'

`hurt(damage)`
- `damage`: number to subtract from health (ignores armor)

`heal(health)`
- `health`: number to add to health

`get_center_pos()`
- returns position at center of hitbox

`pos_in_box(pos[, size])`
- returns true if 'pos' is within hitbox
- `size`: width of box to check in (optional)

`animate(anim)`
- sets animation to `anim`

`set_texture(id, tbl)`
- `id`: table index
- `tbl`: table of textures

`set_scale(x)`
- `x`: multiplier for base scale (0.5 sets scale to half, 2 sets scale to double)

`fix_attached_scale(parent)`
- sets scale to appropriate value when attached to 'parent'
- `parent`: object

`memorize(id, val)`
-- stores `val` to staticdata
- `id`: key for table
- `val`: value to store

`forget(id)`
-- removes `id` from staticdata

`recall(id)`
-- returns value of `id` from staticdata

`timer(n)`
-- returns true avery `n` seconds

`get_hitbox()`
-- returns current hitbox

`get_height()`
-- returns current height

`get_visual_size()`
-- returns current visual size

`follow_wielded_item(player)`
-- returns itemstack, item name of `player`s wielded item if item is in 'follow'

`get_target(target)`
-- returns if `target` is alive, if mob has a line of sight with `target`, position of `target`

Utilities
---------

* `creatura.is_valid(mob)`
	* Returns false if object doesn't exist, otherwise returns ObjectRef/PlayerRef
	* `mob`: Luaentity, ObjectRef, or PlayerRef

* `creatura.is_alive(mob)`
	* Returns false if object doesn't exist or is dead, otherwise returns ObjectRef/PlayerRef
	* `mob`: Luaentity, ObjectRef, or PlayerRef

Environment access
------------------

* `creatura.get_node_height_from_def(name)`
	-- Returns total height of nodebox
	-- `name`: Itemstring/Name of node


* `creatura.get_node_def(node)`
	-- Returns definition of node
	-- `node`: Itemstring/Name of node or position

* `creatura.get_ground_level(pos, max_diff)`
	* Returns first position above walkable node within `max_diff`

* `creatura.is_pos_moveable(pos, width, height)`
	* Returns true if a box with specified `width` and `height` can fit at `pos`
	* `width` should be the largest side of the collision box
	* Check from bottom of box

* `creatura.fast_ray_sight(pos1, pos2, water)`
	* Checks for line of sight between `pos1 and `pos2`
	* Returns bool
	* Returns distance to obstruction

* `creatura.sensor_floor(self, range, water)`
	* Finds distance to ground from bottom of entities hitbox
	* Returns distance to ground or `range` if no ground is found
	* `range`: Maximum range
	* `water`: If false, water will not be counted as ground 

* `creatura.sensor_ceil(self, range, water)`
	* Finds distance to ceiling from top of entities hitbox
	* Returns distance to ceiling or `range` if no ceiling is found
	* `range`: Maximum range
	* `water`: If false, water will not be counted as ceiling

* `creatura.get_nearby_player(self)`
	* Finds player within `self.tracking_range`
	* Returns PlayerRef or nil

* `creatura.get_nearby_players(self)`
	* Finds players within `self.tracking_range`
	* Returns table of PlayerRefs or empty table

* `creatura.get_nearby_object(self, name)`
	* Finds object within `self.tracking_range`
	* Returns ObjectRef or nil
	* `name`: Name of object to search for

* `creatura.get_nearby_objects(self, name)`
	* Finds objects within `self.tracking_range`
	* Returns table of ObjectRefs or empty table
	* `name`: Name of object to search for

Global Mob API
--------------

* `creatura.drop_items(self)`
	* Drops items from `self.drops`

* `creatura.basic_punch_func(self, puncher, time_from_last_punch, tool_capabilities, direction, damage)`
	* Deals damage
	* Applies knockback
	* Visualy and audibly indicates damage

Pathfinding
-----------

Creatura's pathfinder uses the A* algorithm for speed, as well as Theta* for decent performance and more natural looking paths.

Both pathfinders will carry out pathfinding over multiple server steps to reduce lag spikes which does result in the path not
being returned immediately, so your code will have to account for this.

The maximum amount of time the pathfinder can spend per-step (in microseconds) can be adjusted in settings.
	

* `creatura.pathfinder.find_path(self, pos1, pos2, get_neighbors)`
	* Finds a path from `pos1` to `pos2`
	* `get_neighbors` is a function used to find valid neighbors
		* `creatura.pathfinder.get_neighbors_fly` and `creatura.pathfinder.get_neighbors_swim` are bundled by default


* `creatura.pathfinder.find_path_theta(self, pos1, pos2, get_neighbors)`
	* Finds a path from `pos1` to `pos2`
	* Returns a path with arbitrary angles for natural looking paths at the expense of performance
	* `get_neighbors` is a function used to find valid neighbors
		* `creatura.pathfinder.get_neighbors_fly` and `creatura.pathfinder.get_neighbors_swim` are bundled by default